package org.maurange.formation.licpro;

import java.util.ArrayList;

import org.maurange.formation.licpro.rest.Arret;
import org.maurange.formation.licpro.rest.ArretRestMethod;
import org.maurange.formation.licpro.rest.ListArret;

import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.hardware.Camera.Area;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.CheckedTextView;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class ListArretsActivity extends ListActivity implements LocationListener
{
	private static String LOG_TAG = "ListArretsActivity";
	private CallWebServAssyncTask task;
	private ArretAdapter arretAdapter;
	private LocationManager lm;
	Location loc = null;

	
	/**
	 * Methode qui renvoie la tache selon son status
	 * Cette méthode est appellé quand on tourne l'appareil
	 */
	public Object onRetainNonConfigurationInstance() {
		if ( task.getStatus().equals(AsyncTask.Status.FINISHED))
			return null; // Si la tache est fini on renvoie rien 
		else
		{
			task.detach();
			return task; // Sinon on renvoie celle en cours
		}
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		arretAdapter = new ArretAdapter(this, new ArrayList<Arret>());  // On créer l'adapter qui sera dans la liste
		setListAdapter(arretAdapter);
		this.lm =  (LocationManager ) this.getSystemService(LOCATION_SERVICE); // On recuperer l'instance de location service
		getListView().setOnItemClickListener(new OnItemClickListener() { // On active un click listener sur chaque item de la liste
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				Bundle objetbunble = new Bundle();
				objetbunble.putString("code",getArretAdapter().getListArret().get(arg2).getCodeLieu());
				Intent intent = new Intent(ListArretsActivity.this, ArretDetailsActivity.class);
				intent.putExtras(objetbunble);
				startActivityForResult(intent,0); // On lance la deuxième vue spécifique à chaques arrets
			}
			
		});
	}

	@Override
	protected void onResume() {
		super.onResume();
		if(this.lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) // Si le GPS est activé
		{
			Log.d(LOG_TAG, "Activation GPS");
			this.lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,0, this);
			Location location = this.lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
//			Log.d(LOG_TAG, location.getLatitude() + "   Activation GPS   " + location.getLongitude() );
			this.lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
			task = (CallWebServAssyncTask) getLastNonConfigurationInstance(); 
			if (task != null) {
				task.attach(this);  // Si la tache n'est pas null on ratach l'activité 
			}
			else{
				this.task = new CallWebServAssyncTask(ListArretsActivity.this); //Sinon on en créer une nouvelle
				this.task.execute(location.getLatitude(),location.getLongitude()); // On éxecute le web service afin  de récuperer les données
			}
		}
		else
		{
			Log.d(LOG_TAG, "GPS NON ACTIF");
		}
		Log.d(LOG_TAG, "enregistrement des listeners");

	}

	// arret des updates
	@Override
	protected void onPause() {
		super.onPause();
		this.lm.removeUpdates(this);
		Log.d(LOG_TAG, "desenregistrement des listeners");
		// TODO
	}

	public ArretAdapter getArretAdapter() {
		return arretAdapter;
	}

	public void setArretAdapter(ArretAdapter arretAdapter) {
		this.arretAdapter = arretAdapter;
	}

	@Override
	public void onLocationChanged(Location arg0) {  // Si la position GPS a changer on éxecute  la tache pour actualiser
		if(this.task.getStatus().equals(AsyncTask.Status.RUNNING))
		{
			this.task.cancel(true);
			this.task = null;
		}
		this.task = new CallWebServAssyncTask(ListArretsActivity.this);
		loc = this.lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
		this.task.execute(loc.getLatitude(), loc.getLongitude());
	}

	@Override
	public void onProviderDisabled(String arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onProviderEnabled(String arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
		// TODO Auto-generated method stub
		
	}
	
	/**
	 * Class contenant l'assyncTask
	 * @author E105191N
	 *
	 */
	
	
	private static class CallWebServAssyncTask extends
		AsyncTask<Double, Void, ListArret> {
		private Activity activity;
		private boolean running;
		private ListArret listTmp;

		/**
		 * 
		 * @param act l'activité en cours
		 */
		public CallWebServAssyncTask(Activity act) {
			activity = act;
		}

		
		/**
		 * Méthode appellée pendant la tâche 
		 */
		protected ListArret doInBackground(Double... arg0) {
			running = true;
			ArretRestMethod arr = new ArretRestMethod(activity); // On créer une classe qui va aller chercher les informations
			return arr.getArretsRest(arg0[0], arg0[1]);
		}

		/**
		 * @param list , La list retournée par la méthode doInBackground
		 */
		protected void onPostExecute(ListArret list) {
			try {
				((ListArretsActivity) activity).getArretAdapter().getListArret().clear(); // On supprime les items d'avant
			} catch (Exception e) {
			}
			((ListArretsActivity) activity).getArretAdapter().getListArret().addAll(list); // On ajoute tous les nouveaux items
			((ListArretsActivity) activity).getArretAdapter().notifyDataSetChanged(); // On indique que le status a changer et qu'il faut mettre a jour le layout
			running = false;
		}

		public void attach(Activity act) {
			this.activity = act;
		}

		public void detach() {
			this.activity = null;
		}

		public boolean isRunning() {
			return running;
		}

	}
}
